package middleware

import (
	"encoding/base64"
	"encoding/json"
	"fmt"
	"mygin/pkg/response"
	"net/http"

	"github.com/gin-gonic/gin"
)

func DecryptMiddleware() gin.HandlerFunc {
	return func(c *gin.Context) {
		fmt.Println("进入解密阶段")
		// 从请求中获取加密数据（示例）
		encryptedData := c.GetHeader("X-Encrypted-Data")
		iv := c.GetHeader("X-IV") // 假设IV也通过请求头传递

		// 检查请求头是否存在
		if encryptedData == "" || iv == "" {
			c.JSON(http.StatusBadRequest, response.Fail(400, "missing required headers: X-Encrypted-Data and X-IV"))
			c.Abort() // 确保终止后续处理
			return
		}

		// 对Base64编码的字符串进行解码
		encryptedBytes, err := base64.StdEncoding.DecodeString(encryptedData)
		if err != nil {
			c.JSON(http.StatusBadRequest, response.Fail(400, "invalid base64 encrypted data"))
			c.Abort()
			return
		}

		ivBytes, err := base64.StdEncoding.DecodeString(iv)
		if err != nil {
			c.JSON(http.StatusBadRequest, response.Fail(400, "invalid base64 iv"))
			c.Abort()
			return
		}

		// 将字符串转换为[]byte

		// 调用解密函数
		decrypted, err := response.DecryptAES(encryptedBytes, ivBytes)
		if err != nil {
			c.JSON(http.StatusBadRequest, response.Fail(400, fmt.Sprintf("decryption failed: %v", err)))
			c.Abort() // 确保终止后续处理
			return
		}

		// 尝试解析为JSON（如果是JSON数据）
		var result interface{}
		if err := json.Unmarshal(decrypted, &result); err == nil {
			// 如果是有效的JSON，存储解析后的结构
			c.Set("decryptedData", result)
		} else {
			// 如果不是JSON，按原始字节存储（但会被Gin转为Base64）
			// 或者转为字符串存储（如果是文本）
			c.Set("decryptedData", string(decrypted))
		}

		fmt.Printf("Decrypted data: %s\n", decrypted)

		c.Next()
	}
}
